package com.zzl.springboot_mybatis_demo.singleton;

/**
 * Description：单例设计模式
 * Created by 朱正磊 on 2019-09-21 15:58
 */
public class Singleton {

    //1、懒汉式
    /*private static Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }*/

    //2、线程安全的懒汉式（双重检查加锁）
    /*private volatile static Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }*/

    //3、饿汉式
    // 饿汉式是典型的空间换时间，当类装载的时候就会创建类实例，不管你用不用，先创建出来，
    // 然后每次调用的时候，就不需要判断了，节省了运行时间。
    /*private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }*/

    //4、使用静态内部类实现单例模式
    // 当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance，
    // 导致SingletonHolder类得到初始化；而这个类在装载并被初始化的时候，
    // 会初始化它的静态域，从而创建Singleton的实例，由于是静态的域，
    // 因此只会在虚拟机装载类的时候初始化一次，并由虚拟机来保证它的线程安全性。
    private static class SingletonHolder {
        //静态初始化器，由JVM来保证线程安全
        private static Singleton instance = new Singleton();
    }

    private Singleton() {}

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }

}
